Fork me on GitHub

Java集合框架 - Collection架构与源码分析

注意:所有文章除特别说明外,转载请注明出处.

Java集合框架 - Collection架构与源码分析

Collection是一个接口,它主要的两个分支是List和Set。List和Set都是接口,它们继承与Collection。List是有序的队列,可以用重复的元素;而Set是数学概念中的集合,不能有重复的元素。List和Set都有它们各自的实现类。

我们抽象出AbstractCollection类来让其他类继承,该类实现类Collection中的绝大部分方法。AbstractList和AbstractSet都继承与AbstractCollection,具体的List实现类继承与AbstractList,而Set的实现类则继承与AbstractSet。

Collection中有个iterator()方法,它的作用是返回一个Iterator接口。通常,我们通过Iterator迭代器来遍历集合。ListIterator是List接口所特有的,在List接口中,通过ListIterator()返回一个ListIterator对象。

Collection

//Collection定义
public interface Collection<E> extends Iterable<E> {}

从Collection的定义可以看出,Collection是一个接口。是一个高度抽象出来的集合,包含了集合的基本操作:添加|删除|清空|遍历|是否为空|获取大小等。Collection接口的所有子类都必须实现2中构造函数:1.不带参数的构造函数。2.参数为Collection的构造函数。ps:带参数的构造函数可以用来转换Collection类型。

// Collection的API
abstract boolean         add(E object)
abstract boolean         addAll(Collection<? extends E> collection)
abstract void            clear()
abstract boolean         contains(Object object)
abstract boolean         containsAll(Collection<?> collection)
abstract boolean         equals(Object object)
abstract int             hashCode()
abstract boolean         isEmpty()
abstract Iterator<E>     iterator()
abstract boolean         remove(Object object)
abstract boolean         removeAll(Collection<?> collection)
abstract boolean         retainAll(Collection<?> collection)
abstract int             size()
abstract <T> T[]         toArray(T[] array)
abstract Object[]        toArray()

List

//List定义
public interface List<E> extends Collection<E> {}

从List定义可以得到,List接口继承Collection接口即List是集合的一种。List是有序的队列,List中的每一个元素都有一个索引,第一个元素的索引值为0,往后的元素的索引值依次+1.,List中允许有重复的元素。List继承Collection自然包含了Collection的所有接口,由于List是有序队列,所以它也有自己额外的API接口。

// Collection的API
abstract boolean         add(E object)
abstract boolean         addAll(Collection<? extends E> collection)
abstract void            clear()
abstract boolean         contains(Object object)
abstract boolean         containsAll(Collection<?> collection)
abstract boolean         equals(Object object)
abstract int             hashCode()
abstract boolean         isEmpty()
abstract Iterator<E>     iterator()
abstract boolean         remove(Object object)
abstract boolean         removeAll(Collection<?> collection)
abstract boolean         retainAll(Collection<?> collection)
abstract int             size()
abstract <T> T[]         toArray(T[] array)
abstract Object[]        toArray()
// 相比与Collection,List新增的API:
abstract void                add(int location, E object) //在指定位置添加元素
abstract boolean             addAll(int location, Collection<? extends E> collection) //在指定位置添加其他集合中的元素
abstract E                   get(int location) //获取指定位置的元素
abstract int                 indexOf(Object object) //获得指定元素的索引
abstract int                 lastIndexOf(Object object) //从右边的索引
abstract ListIterator<E>     listIterator(int location) //获得iterator
abstract ListIterator<E>     listIterator()
abstract E                   remove(int location) //删除指定位置的元素
abstract E                   set(int location, E object) //修改指定位置的元素
abstract List<E>             subList(int start, int end) //获取子list

Set

//Set的定义
public interface Set<E> extends Collection<E> {}

Set也继承与Collection接口,且里面不能有重复元素。关于API,Set与Collection的API完全一样,不再赘述。

AbstractCollection

//AbstractCollection的定义
public abstract class AbstractCollection<E> implements Collection<E> {}

AbstractCollection是一个抽象类,实现了Collection中除了iterator()和size()之外的所有方法。AbstractCollection的主要作用是方便其它类实现Collection。如:ArrayList | LinkedList等。它们如果想要实现Collection接口,通过继承AbstractCollection就已经实现大部分方法,再实现iterator()和size()方法即可。

//AbtractCollection源码在这里省略是因为是实现上面的所有方法

AbstractList

//定义
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {}

从定义可以看出,AbstractList是一个继承AbstractCollection,并且实现了List接口的抽象类。它实现了List中除了size()、get(int location)之外的方法。

AbstractList的主要作用:它实现了List接口中的大部分函数,从而方便其它类继承List。另外,和AbstractCollection相比,AbstractList抽象类中,实现了iterator()方法。

//这里省略源码复制,后面对比看..

AbstractSet

//定义
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {}

AbstractSet是一个继承与AbstractCollection,并且实现了Set接口的抽象类。由于Set接口和Collection接口中的API完全一样,所以Set也就没有自己单独的API。和AbstractCollection一样,它实现了List中除iterator()和size()外的方法。所以源码和AbstractCollection的一样。

//源码省略...

Iterator

//定义
public interface Iterator<E> {}

Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历其中的元素。Iterator提供的API接口包括:是否存在下一个元素,获取下一个元素和删除当前元素。

注意:Iterator遍历Collection时,是fail-fast机制:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了,那么线程A访问集合时,就会抛出CurrentModificationException异常,产生fail-fast事件。

// Iterator的API
abstract boolean hasNext()
abstract E next()
abstract void remove()

本文标题:Java集合框架 - Collection架构与源码分析

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:12:07

原始链接:http://bangjinhu.github.io/undefined/Java集合框架 - Collection架构与源码分析/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.